#include "inputOutputHandler.h"
#include "cpuSimulator.h"
#include <QDebug>
#include <QTimer>

/**
 * @brief InputOutputHandler构造函数
 */
InputOutputHandler::InputOutputHandler(QObject *parent)
    : SystemCallHandler(parent)
    , outputWidget(nullptr)
    , synchronousInput(true)
    , currentOutputFormat(OutputFormat::PlainText)
    , foregroundColor(7)  // 白色
    , backgroundColor(0)  // 黑色
    , cursorRow(0)
    , cursorColumn(0)
    , waitingForInput(false)
{
    // 初始化默认设置
}

/**
 * @brief InputOutputHandler析构函数
 */
InputOutputHandler::~InputOutputHandler()
{
    // 清理资源
}

/**
 * @brief 处理中断调用
 * @param interruptNumber 中断号
 * @param cpu CPU模拟器指针
 * @return SystemCallResult 处理结果
 */
SystemCallResult InputOutputHandler::handleInterrupt(int interruptNumber, CpuSimulator* cpu)
{
    if (!isInterruptSupported(interruptNumber)) {
        return createErrorResult(-1, "不支持的输入输出中断号");
    }
    
    switch (interruptNumber) {
        case 0x20: return handleCharacterOutput(cpu);
        case 0x21: return handleStringOutput(cpu);
        case 0x22: return handleIntegerOutput(cpu);
        case 0x23: return handleFormattedOutput(cpu);
        case 0x24: return handleCharacterInput(cpu);
        case 0x25: return handleStringInput(cpu);
        case 0x26: return handleIntegerInput(cpu);
        case 0x27: return handleClearScreen(cpu);
        case 0x28: return handleSetCursorPosition(cpu);
        case 0x29: return handleSetTextColor(cpu);
        default:
            return createErrorResult(-1, QString("未实现的输入输出中断: 0x%1").arg(interruptNumber, 2, 16, QChar('0')));
    }
}

/**
 * @brief 获取支持的中断号范围
 * @return QPair<int, int> 中断号范围
 */
QPair<int, int> InputOutputHandler::getSupportedInterruptRange() const
{
    return qMakePair(0x20, 0x29);
}

/**
 * @brief 获取处理器描述
 * @return QString 描述信息
 */
QString InputOutputHandler::getDescription() const
{
    return "输入输出处理器 - 支持字符、字符串、整数的输入输出操作";
}

/**
 * @brief 重置处理器状态
 */
void InputOutputHandler::reset()
{
    // 清空输出缓冲区
    outputBuffer.clear();
    
    // 重置光标位置
    cursorRow = 0;
    cursorColumn = 0;
    
    // 重置颜色
    foregroundColor = 7; // 白色
    backgroundColor = 0; // 黑色
}

/**
 * @brief 处理用户输入
 * @param input 用户输入的文本
 */
void InputOutputHandler::handleUserInput(const QString& input)
{
    QMutexLocker locker(&inputMutex);
    
    // 将输入添加到队列
    inputQueue.enqueue(input);
    
    // 如果正在等待输入，发送信号
    if (waitingForInput) {
        waitingForInput = false;
        emit outputMessage(QString("收到用户输入: %1").arg(input));
    }
}

/**
 * @brief 设置输出控件
 * @param outputWidget 输出文本控件指针
 */
void InputOutputHandler::setOutputWidget(QTextEdit* outputWidget)
{
    this->outputWidget = outputWidget;
}

/**
 * @brief 设置输入模式
 * @param synchronous 是否为同步输入模式
 */
void InputOutputHandler::setInputMode(bool synchronous)
{
    synchronousInput = synchronous;
}

/**
 * @brief 处理字符输出中断
 * @param cpu CPU模拟器指针
 * @return SystemCallResult 处理结果
 */
SystemCallResult InputOutputHandler::handleCharacterOutput(CpuSimulator* cpu)
{
    qDebug() << "开始处理字符输出中断 0x20";
    
    // 简化处理：直接发射信号，避免延迟问题
    qDebug() << "直接获取寄存器值进行输出";
    int code = cpu->getRegister("AX");
    QString message = QString(QChar(code));
    qDebug() << "获取AX寄存器字符ASCII码:" << code << "字符:" << message;
    qDebug() << "即将发射outputMessage信号，内容:" << message;
    emit outputMessage(message);
    qDebug() << "outputMessage信号已发射";
    
    // 不返回任何寄存器值，避免覆盖用户寄存器
    QMap<QString, int> result;
    return createSuccessResult(result);
}

/**
 * @brief 处理字符串输出中断
 * @param cpu CPU模拟器指针
 * @return SystemCallResult 处理结果
 */
SystemCallResult InputOutputHandler::handleStringOutput(CpuSimulator* cpu)
{
    Q_UNUSED(cpu)
    qDebug() << "开始处理字符串输出中断 0x21";
    
    // 字符串输出暂时使用固定值，因为需要从内存读取字符串
    QString message = "Hello, World!";
    qDebug() << "输出字符串:" << message;
    qDebug() << "即将发射outputMessage信号，内容:" << message;
    emit outputMessage(message);
    qDebug() << "outputMessage信号已发射";
    
    QMap<QString, int> result;
    return createSuccessResult(result);
}

/**
 * @brief 处理整数输出中断
 * @param cpu CPU模拟器指针
 * @return SystemCallResult 处理结果
 */
SystemCallResult InputOutputHandler::handleIntegerOutput(CpuSimulator* cpu)
{
    qDebug() << "开始处理整数输出中断 0x22";
    
    // 获取AX寄存器的值进行输出
    int value = cpu->getRegister("AX");
    qDebug() << "获取AX寄存器的值:" << value;
    
    // 格式化输出消息
    QString message = QString("整数输出: %1").arg(value);
    qDebug() << "即将发射outputMessage信号，内容:" << message;
    emit outputMessage(message);
    qDebug() << "outputMessage信号已发射";
    
    // 不返回任何寄存器值，避免覆盖用户寄存器
    QMap<QString, int> result;
    return createSuccessResult(result);
}

// 其他方法的占位实现
SystemCallResult InputOutputHandler::handleFormattedOutput(CpuSimulator* cpu) { Q_UNUSED(cpu) return createSuccessResult(); }
SystemCallResult InputOutputHandler::handleCharacterInput(CpuSimulator* cpu) { Q_UNUSED(cpu) return createSuccessResult(); }
SystemCallResult InputOutputHandler::handleStringInput(CpuSimulator* cpu) { Q_UNUSED(cpu) return createSuccessResult(); }
SystemCallResult InputOutputHandler::handleIntegerInput(CpuSimulator* cpu) { Q_UNUSED(cpu) return createSuccessResult(); }
SystemCallResult InputOutputHandler::handleClearScreen(CpuSimulator* cpu) { Q_UNUSED(cpu) return createSuccessResult(); }
SystemCallResult InputOutputHandler::handleSetCursorPosition(CpuSimulator* cpu) { Q_UNUSED(cpu) return createSuccessResult(); }
SystemCallResult InputOutputHandler::handleSetTextColor(CpuSimulator* cpu) { Q_UNUSED(cpu) return createSuccessResult(); } 